;layui.define(['layer','jquery','laytpl','table'],function (exports) {
    "use strict";
    let layer = layui.layer
    , $ = layui.jquery
    , laytpl = layui.laytpl
    , table = layui.table
    , MOD_NAME = 'common'
    , Common = function(){

    }
    Common.prototype = {
        constructor:Common
        , msg:{
            //警告
            warn(message){
                return layer.msg(message,{icon:0})
            }
            //正确
            ,success(message){
                layer.msg(message,{icon:1})
            }
            //错误
            ,error(message){
                layer.msg(message,{icon:2})
            }
            //询问
            ,confirm(message,ensure,cancle){
                layer.confirm(message,{icon:3},function (index) {
                    typeof ensure == 'function' && ensure.call(this,index);
                },function(index){
                    typeof cancle == 'function' && cancle.call(this,index);
                })
            }
            //吸附层提示类型
            ,tips(options){
                let direct = {
                    'up':1
                    ,'right':2
                    ,'down':3
                    ,'left':4
                }
                layer.tips(options.msg, options.selector,{
                    tips:[direct[options.direct]||2,options.backColor||'#393D49']
                });
            }
        }
        //ajax
        , sendXHR(options,done,fail){
            let deffer = $.ajax($.extend({},{
                url:''
                ,type:'post'
                ,dataType:'json'
                ,data:null
                //,contentType:'application/json;charset=utf-8'
            },options));
            deffer.then((data)=>{
                typeof done == 'function' && done(data)
            },(data)=>{
                typeof fail == 'function' && fail(data)
            });
        }
        //重置表单
        , resetForm(formId){
            document.getElementById(formId).reset();
        }
        //转json对象
        , serializeArrayToJson(serializeArray){
            let jsonObj = {}
            serializeArray.map(item=>{
                jsonObj[item.name] = item.value
            });
            return jsonObj;
        }
        /* 渲染模板语法
         * tplEl:模板元素
         * pourEl注入元素
         * data:数据
         */
        , renderTpl(tplEl,pourEl,data){
            if(typeof data != 'object'){return}
            laytpl(tplEl.innerHTML).render(data, function(html){
                pourEl.innerHTML = html;
            });
        }
        /*
        * 异步渲染dom元素。
        * 支持同步渲染和异步渲染两种方式。异步渲染请指定url、同步渲染请指定data
        * options={
        *  url:'',可选项,url和data请确保其中任意一个有值
        *  dataFormat:可选项，使用时必须把格式化后的数据return
        *  tplEl:必选项,可以是模板元素本身或tplEL的id属性值
        *  pourEl:必选项,数据最终要渲染到那个容器中，可以是模板元素本身或tplEL的id属性值
        *  updateFormControlType:可选项,要更新的表单控件类型。'radio','checkbox','select','all'。若不指定默认是'all'
        * }
        * */
        , asyncRenderDOMEl(options){
            let pourEl = options.pourEl
                , tplEl = options.tplEl
                //指定数据格式
                , data = options.data
                , updateFormControlType = options.updateFormControlType
                , isDOMEl = typeof HTMLElement === 'object'
                ? function(obj) {return obj instanceof HTMLElement;}
                : function(obj) {return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';}
                ,renderDOMEl = function (tplEl,pourEl,data) {
                    tplEl = !isDOMEl(tplEl) ? common.getEl(tplEl):tplEl
                    pourEl = !isDOMEl(pourEl) ? common.getEl(pourEl):pourEl
                    common.renderTpl(tplEl,pourEl,data)
                    //添加是否加载标识
                    pourEl.setAttribute('isload',true)
                    if(updateFormControlType){
                        //更新控件
                        if(updateFormControlType){
                            form.render(updateFormControlType);
                        }
                        if(updateFormControlType == 'all'){
                            form.render();
                        }
                    }
                };

            pourEl = !isDOMEl(pourEl) ? common.getEl(pourEl) : pourEl;
            tplEl = !isDOMEl(tplEl) ? common.getEl(tplEl) : tplEl;
            //判断控件是否已加载
            //如果已加载不在重新请求
            if(pourEl && !pourEl.getAttribute('isload') && options.url){
                common.sendXHR({
                    url:options.url
                },(resObj)=>{
                    if(options.dataFormat){
                        let dataFormat = options.dataFormat.call(null,resObj);
                        if(dataFormat){
                            renderDOMEl(tplEl,pourEl,dataFormat);
                        }
                    }else{
                        renderDOMEl(tplEl,pourEl,resObj);
                    }
                });
            }else{
                if(!options.url){
                    if(options.dataFormat){
                        let dataFormat = options.dataFormat.call(this,data);
                        renderDOMEl(tplEl,pourEl,dataFormat);
                    }else{
                        renderDOMEl(tplEl,pourEl,data);
                    }
                }
            }
        }
        , createLayer(options){
            layer.open($.extend({},{
                type: 1
                , area: 'auto'
                , offset: 'auto'
                , fixed: true
                , scrollbar: false //禁用窗口滚动条
                , title: ''
                , btn: ["确定","取消"]
                , btnAlign: 'c'
                , content: ''
                , success: function(layero, index) {

                }
                //确定按钮的回调
                ,yes: function(index, layero){

                }
                //取消按钮的回调
                ,btn2:function (index, layero) {
                    layer.close(index)
                }
                //'×'符号的回调
                ,cancel:function (index,layero) {
                    layer.close(index)
                }
            },options));
        }
        /**
         * where:必须是一个对象字面
         * curTablePage:数值类型
         * */
        , reloaTable(tableIns,curTablePage,where){
            tableIns.reload({
                where:where
                ,page:{
                    curr: curTablePage||1
                }
            });
        }
        /**获取选中的表格数据
         * tableId不要带#号
         * */
        , getCheckedData(tableId){
            let checkStatus = table.checkStatus(tableId)
                ,checkData = checkStatus.data;
            if(checkData.length<=0){common.msg.warn("请至少选中一行！！");return;}
            return checkData;
        }
        /** 初始化日期
         *  mountEl：挂在点
         *  doned：初始化结束后的回掉函数
         *  initVal:默认值
         */
        , initCalender(mountEl,doned,initVal){
            laydate.render({
                elem: mountEl //指定元素
                ,value: initVal||''
                ,done: doned
            });
        }
    }

    let common = new Common();

    exports(MOD_NAME, common);
})